package com.hsjk.szwj.module.pay.dal.dataobject.config;

import cn.hutool.json.JSONUtil;
import com.hsjk.szwj.framework.mq.core.pubsub.AbstractChannelMessage;
import com.hsjk.szwj.framework.mq.core.stream.AbstractStreamMessage;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

/**
 * @author chenjiawei
 * @desc 【！重要配置项！】 定义Msg消息载体
 * @Date 2023/08/23 10:52
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PayOrderDivisionMQ extends AbstractStreamMessage implements Serializable {


    /**
     * 内置msg 消息体定义
     **/
    private MsgPayload payload;

    /**
     * 【！重要配置项！】 定义Msg消息载体
     **/
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class MsgPayload implements Serializable{

        /**
         * 支付订单号
         **/
        private Long payOrderId;

        /**
         * 是否使用默认分组
         **/
        private Integer useSysAutoDivisionReceivers;

        /**
         * 分账接受者列表， 字段值为空表示系统默认配置项。
         * 格式：{receiverId: '1001', receiverGroupId: '1001', divisionProfit: '0.1'}
         * divisionProfit: 空表示使用系统默认比例。
         **/
        private List<CustomerDivisionReceiver> receiverList;

        /**
         * 是否重新发送 ( 如分账失败，重新请求分账接口 ) ， 空表示false
         **/
        private Boolean isResend;
        /**
         * 多租户编号
         */
        private Long tenantId;
    }

    /**
     * 自定义定义接收账号定义信息
     **/
    @Data
    @AllArgsConstructor
    public static class CustomerDivisionReceiver implements Serializable{

        /**
         * 分账接收者ID (与receiverGroupId 二选一)
         */
        private Long receiverId;

        /**
         * 组ID（便于商户接口使用） (与 receiverId 二选一)
         */
        private Long receiverGroupId;

        /**
         * 分账比例 （可以为空， 为空表示使用系统默认值）
         */
        private BigDecimal divisionProfit;

    }

    /**
     * 【！重要配置项！】 构造MQModel , 一般用于发送MQ时
     **/
    public static PayOrderDivisionMQ build(Long payOrderId, Integer useSysAutoDivisionReceivers,
                                           List<CustomerDivisionReceiver> receiverList, Long tenantId) {
        return new PayOrderDivisionMQ(new MsgPayload(payOrderId, useSysAutoDivisionReceivers,
                receiverList, false, tenantId));
    }

    /**
     * 【！重要配置项！】 构造MQModel , 一般用于发送MQ时
     **/
    public static PayOrderDivisionMQ build(Long payOrderId, Integer useSysAutoDivisionReceivers,
                                           List<CustomerDivisionReceiver> receiverList, Boolean isResend, Long tenantId) {
        return new PayOrderDivisionMQ(new MsgPayload(payOrderId, useSysAutoDivisionReceivers,
                receiverList, isResend, tenantId));
    }

    /**
     * 解析MQ消息， 一般用于接收MQ消息时
     **/
    public static MsgPayload parse(String msg) {
        return JSONUtil.toBean(msg, MsgPayload.class);
    }

    @Override
    public String getStreamKey() {
        return "pay-order-division";
    }
}
